import { Config } from '../components/index.js'
import { initImpart } from "../model/InitImpart.js"

// 定义一个数组，存储功能和对应的正则表达式
let funs = [
    { name: 'create', regex: /^#?生成牛牛$/ },
    { name: 'ziwei', regex: /^#?(开导|打胶)$/ },
    { name: 'suo', regex: /^#?嗦牛牛$/ },
    { name: 'pk', regex: /^#?决斗$/ },
    { name: 'remake', regex: /^#?remake$/ },
    { name: 'query', regex: /^#?(精神状态查看|查看)$/ },
    { name: 'player_group_rank', regex: /^#?今日排行$/ }
]

// 定义一个对象，存储功能和对应的参数列表
let paramsList = {
    create: ['qq_myself', 'qqgroup_myself'],
    ziwei: ['qq_myself', 'qqgroup_myself'],
    suo: ['qq_myself', 'qq_pk'],
    pk: ['qq_myself', 'qq_pk'],
    remake: ['qq_myself', 'qqgroup_myself'],
    query: ['qq_myself'],
    player_group_rank: ['qqgroup_myself']
}

function getFunAndParams(e) {
    // 定义一个变量error，用来存储是否有错误发生，初始值为false
    let error = false
    // 从e中提取user_id, group_id, msg, at等属性
    let { user_id, group_id, msg, at } = e
    // 从Config中提取api属性
    let { api } = Config
    // 限制
    if (!e.isGroup) {
        return {
            reply: "请在群聊执行",
            error: true
        }
    }
    if (initImpart(e) == false) {
        return {
            reply: `本群银趴还未开始，请联系群主或管理员开启哦~\n请发送指令开始银趴或者结束银趴`,
            error: true
        }
    }
    // 获取艾特的人数
    let atCount = e.message.filter(item => item.type == 'at').length
    // 如果艾特的人数大于1，就返回一个reply对象，并且设置error为true
    if (atCount > 1) {
        return {
            reply: "艾特那么多人你干嘛哎呦",
            error: true
        }
    }
    // 查找匹配的功能
    let fun = funs.find(f => msg.match(f.regex))
    // 如果没有找到，返回一个reply对象，并且设置error为true
    if (!fun) return {
        reply: "没有匹配到功能，请检查你的指令是否正确",
        error: true
    }
    // 定义一个对象，存储公共的参数
    let commonParams = {
        qq_myself: user_id,
        qqgroup_myself: group_id
    }
    // 根据不同的功能，合并或覆盖参数
    switch (fun.name) {
        case 'suo':
            Object.assign(commonParams, {
                qq_pk: at || user_id
            })
            break
        case 'pk':
            // pk功能需要覆盖qq_pk属性，并且检查是否合法
            if (at === user_id) {
                // 如果at等于user_id，返回一个reply对象，并且设置error为true
                error = true
                return {
                    reply: "打自己是吧，会影分身再来吧",
                    error: error
                }
            }
            if (!at) {
                // 如果at为空或者undefined，返回一个reply对象，并且设置error为true
                error = true
                return {
                    reply: `请艾特你的击剑对象`,
                    error: error
                }
            }
            Object.assign(commonParams, {
                qq_pk: at
            })
            break
        case 'query':
            // query功能只需要qq_myself属性，并且可能是数组
            if (at) {
                commonParams.qq_myself = e.message.filter(item => item.type == 'at')?.map(item => item?.qq)
            }
            break
        case 'player_group_rank':
            // player_group_rank功能只需要qqgroup_myself属性，删除qq_myself属性
            delete commonParams.qq_myself
            break
    }
    // 过滤掉不在paramsList中的参数，并转换为键值对数组
    let params = Object.entries(commonParams).filter(item => paramsList[fun.name].includes(item[0]))
    // 检查是否有null或者undefined值
    if (params.some(item => item[1] == null)) {
        // 如果有null或者undefined值，说明没有获取到某些参数，就把error设为true，并且返回一个reply对象，并且说出缺了什么参数
        error = true
        let missingParams = params.filter(item => item[1] == null).map(item => item[0]).join(', ')
        return {
            reply: `缺少${missingParams}参数，请补全后再试`,
            error: error,
            fun: fun.name
        }
    }
    // 拼接url地址，并返回一个url对象，并且设置error为false
    return {
        url: api + 'fun=' + fun.name + '&' + params.map(([key, value]) => `${key}=${value}`).join('&'),
        error: error,
        fun: fun.name
    }
}

export {
    getFunAndParams,
    funs
}